package jp.co.toshiba.ffsa.common;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

/**
 * ハッシュコードを作成します。
 * @author  NPC
 */
public class MakeHash {

    /**
    * SHA-1でハッシュコードを作成します。
    * @return
    */
    public static String getSha1HashCode(String str) throws Exception{
        try{
            MakeHash hash = new MakeHash();
            return hash.getHash(str, "SHA-1");
        }catch(Exception e){
            throw e;
        }
    }

    /**
    * SHA-256でハッシュコードを作成します。
    * @return
    */
    public static String getSha256HashCode(String str) throws Exception{
        try{
            MakeHash hash = new MakeHash();
            return hash.getHash(str, "SHA-256");
        }catch(Exception e){
            throw e;
        }
    }

    /**
    * SHA-512でハッシュコードを作成します。
    * @return
    */
    public static String getSha512HashCode(String str) throws Exception{
        try{
            MakeHash hash = new MakeHash();
            return hash.getHash(str, "SHA-512");
        }catch(Exception e){
            throw e;
        }
    }

    /**
    * MD5でハッシュコードを作成します。
    * @return
    */
    public static String getMD5HashCode(String str) throws Exception{
        try{
            MakeHash hash = new MakeHash();
            return hash.getHash(str, "MD5");
        }catch(Exception e){
            throw e;
        }
    }

    /**
     * ハッシュ値を返します。
     * @param org
     * @param algorithm
     * @return ハッシュ値
     */
    public String getHash(String org, String algorithm){
        // 引数・アルゴリズム指定が無い場合は計算しない
        if ((org== null)||(algorithm== null)){
            return null;
        }

        // 初期化
        MessageDigest md= null;
        try{
            md= MessageDigest.getInstance(algorithm);
        }
        catch(NoSuchAlgorithmException e){
            return null;
        }

        md.reset();
        md.update(org.getBytes());
        byte[] hash= md.digest();

        // ハッシュを16進数文字列に変換
        StringBuffer sb= new StringBuffer();
        int cnt= hash.length;
        for(int i= 0; i< cnt; i++){
            sb.append(Integer.toHexString( (hash[i]>> 4) & 0x0F ) );
            sb.append(Integer.toHexString( hash[i] & 0x0F ) );
        }
        return sb.toString();
    }

}
